#include "FrameDelAdministrador.h"

FrameDelAdministrador::FrameDelAdministrador(GestorArchivoConfiguracion& gestor):
	agregar(Gtk::Stock::ADD), guardar(Gtk::Stock::SAVE), nuevo(Gtk::Stock::NEW),
	borrar(Gtk::Stock::DELETE), frameTablaYGrafico(gestor) {

	numeroConsultas = 0;
	cargarVector();
	frameSeleccion.setValores(valores);

	frameTablaYGrafico.setFrameFiltro(&frameFiltrosInputs);
	framePrueba.set_size_request(600,460);
	framePrueba.set_border_width(5);
	framePrueba.add(frameTablaYGrafico);

	mostrar.set_label("Ver");
	nuevo.set_sensitive(false);
	inicializarBotones();


	cajaBotones.pack_start(nuevo, Gtk::PACK_EXPAND_PADDING);	//
	cajaBotones.pack_start(agregar, Gtk::PACK_EXPAND_PADDING);	//
	cajaBotones.pack_start(borrar, Gtk::PACK_EXPAND_PADDING);	//
	cajaBotones.pack_start(guardar, Gtk::PACK_EXPAND_PADDING);	//
	cajaBotones.pack_start(mostrar, Gtk::PACK_EXPAND_PADDING);	//
	cajaBotones.set_size_request(580,30);


	cajaHorizontal.pack_start(frameSeleccion, Gtk::PACK_SHRINK);
	cajaHorizontal.pack_start(framePrueba, Gtk::PACK_SHRINK);

	cajaVertical.pack_start(cajaHorizontal, Gtk::PACK_SHRINK);
	cajaVertical.pack_start(cajaBotones, Gtk::PACK_SHRINK);
	add(cajaVertical);

	conectarManejadoresEventos();
}

void FrameDelAdministrador::inicializarBotones() {
	agregar.set_size_request(70,30);
	borrar.set_size_request(70,30);
	guardar.set_size_request(70,30);
	nuevo.set_size_request(70,30);
	mostrar.set_size_request(70,30);
}

bool FrameDelAdministrador::hayElegido(std::map<char, vector<std::string> >& mapa, char tipo) {
	std::map<char, vector<std::string> >::iterator it = mapa.begin();
	for(; it != mapa.end(); it++) {
		if(it->first == tipo)
			return true;
	}
	return false;
}


void FrameDelAdministrador::on_clicked_boton_ver() {
	// primero veo si hay consultas añadidas antes

	if(numeroConsultas) {
		std::cout<<datosDeTabla<<std::endl;

		for(int contador = 1; contador <= numeroConsultas; contador++) {
			std::cout<<"Consulta Nº: "<<contador<<std::endl;

			std::cout<<"Grafico"<<std::endl;
			std::cout<<graficos[contador]<<std::endl;

			std::map<int, std::map<char, vector<std::string> > >::iterator itF = filtros.begin();
			if(!filtros.size())
			for(;itF!=filtros.end(); itF++) {
				if(itF->first == contador) {	// mal hecho pero anda

					if(hayElegido(filtros[contador], 'D')) {
						std::cout<<"Filtros Dimension"<<std::endl;
						std::vector<std::string> & X= filtros[contador]['D'];
						std::vector<std::string>::iterator iX = X.begin();
						for(; iX !=X.end();iX++)
							std::cout<<*iX<<std::endl;
					}
					if(hayElegido(filtros[contador], 'H')) {
						std::cout<<"Filtros Hecho"<<std::endl;
						std::vector<std::string> & X= filtros[contador]['H'];
						std::vector<std::string>::iterator iX = X.begin();
						for(; iX !=X.end();iX++)
							std::cout<<*iX<<std::endl;
					}
					break;
				}
			}


			std::map<int, std::map<char, vector<std::string> > >::iterator itI = inputs.begin();
			if(!inputs.size())
			for(;itI!=inputs.end(); itI++) {
				if(itI->first == contador) {	// mal hecho pero anda

					if(hayElegido(inputs[contador], 'D')) {
						std::cout<<"Inputs Dimension"<<std::endl;
						std::vector<std::string> & X= inputs[contador]['D'];
						std::vector<std::string>::iterator iX = X.begin();
						for(; iX !=X.end();iX++)
							std::cout<<*iX<<std::endl;
					}
					if(hayElegido(inputs[contador], 'H')) {
						std::cout<<"Inputs Hecho"<<std::endl;
						std::vector<std::string> & X= inputs[contador]['H'];
						std::vector<std::string>::iterator iX = X.begin();
						for(; iX !=X.end();iX++)
							std::cout<<*iX<<std::endl;
					}
					break;
				}
			}



		}
	}

/*
	// si hay una consulta nueva recien creada se muestra

	if(frameTablaYGrafico.eleccionCompleta()) {	// si hay consulta recientemente creada
		std::string grafico;
		std::string numeroTabla;
		std::string nombreTabla;

		frameTablaYGrafico.getGraficoElegido(grafico);
		frameTablaYGrafico.getDatosTablaElegida(numeroTabla, nombreTabla);

		std::vector<std::string> &valoresFiltrosDimensiones = frameFiltrosInputs.getValoresFiltrosDimensiones();
		std::vector<std::string> &valoresFiltrosHechos = frameFiltrosInputs.getValoresFiltrosHechos();
		std::vector<std::string> valoresInputsDimensiones = frameFiltrosInputs.getValoresInputsDimensiones();
		std::vector<std::string> valoresInputsHechos = frameFiltrosInputs.getValoresInputsHechos();

		std::cout<<"COnsulta nueva"<<std::endl;
		std::cout<<"Numero: "<< numeroConsultas + 1<<std::endl;
		std::cout<<"Grafico"<<std::endl;
		std::cout<<grafico<<std::endl;

		if(!valoresFiltrosDimensiones.empty()) {
			std::cout<<"Filtros Dimension"<<std::endl;
			std::vector<std::string>::iterator ixx= valoresFiltrosDimensiones.begin();
			for(;ixx!=valoresFiltrosDimensiones.end();ixx++)
				std::cout<<*ixx<<std::endl;
		}

		if(!valoresFiltrosHechos.empty()) {
			std::cout<<"Filtros hechos"<<std::endl;
			std::vector<std::string>::iterator ixx= valoresFiltrosHechos.begin();
			for(;ixx!=valoresFiltrosHechos.end();ixx++)
				std::cout<<*ixx<<std::endl;
		}
		if(!valoresInputsDimensiones.empty()) {
			std::cout<<"inputs Dimension"<<std::endl;
			std::vector<std::string>::iterator ixx= valoresInputsDimensiones.begin();
			for(;ixx!=valoresInputsDimensiones.end();ixx++)
				std::cout<<*ixx<<std::endl;
		}
		if(!valoresInputsHechos.empty()) {
			std::cout<<"inputs hechos"<<std::endl;
			std::vector<std::string>::iterator ixx= valoresInputsHechos.begin();
			for(;ixx!=valoresInputsHechos.end();ixx++)
				std::cout<<*ixx<<std::endl;
		}
	}
	*/
}

void FrameDelAdministrador::on_clicked_agregar() {

	if(frameTablaYGrafico.eleccionCompleta()) {	// si hay consulta recientemente creada
		numeroConsultas++;

		std::string grafico;				std::string numeroTabla; 				std::string nombreTabla;

			frameTablaYGrafico.getGraficoElegido(grafico);
			frameTablaYGrafico.getDatosTablaElegida(numeroTabla, nombreTabla);

			std::vector<std::string> &valoresFiltrosDimensiones = frameFiltrosInputs.getValoresFiltrosDimensiones();
			std::vector<std::string> &valoresFiltrosHechos = frameFiltrosInputs.getValoresFiltrosHechos();
			std::vector<std::string> valoresInputsDimensiones = frameFiltrosInputs.getValoresInputsDimensiones();
			std::vector<std::string> valoresInputsHechos = frameFiltrosInputs.getValoresInputsHechos();

			if(!valoresFiltrosDimensiones.empty())
				filtros[numeroConsultas]['D'] = valoresFiltrosDimensiones;

			if(!valoresFiltrosHechos.empty())
				filtros[numeroConsultas]['H'] = valoresFiltrosHechos;

			if(!valoresInputsDimensiones.empty())
				inputs[numeroConsultas]['D'] = valoresInputsDimensiones;

			if(!valoresInputsHechos.empty())
				inputs[numeroConsultas]['H'] = valoresInputsHechos;

			graficos[numeroConsultas] = grafico;
			datosDeTabla = numeroTabla;
			datosDeTabla.append(1, Util::SEPARADORFILECONSULTA);
			datosDeTabla.append(nombreTabla);

	}

}

void FrameDelAdministrador::conectarManejadoresEventos() {
	Glib::RefPtr<Gtk::TreeSelection> filaSeleccionada = frameSeleccion.getVisorModelo().get_selection();
	filaSeleccionada->signal_changed().connect(sigc::mem_fun(*this, &FrameDelAdministrador::on_selection_changed));
	agregar.signal_clicked().connect(sigc::mem_fun(*this, &FrameDelAdministrador::on_clicked_agregar));
	mostrar.signal_clicked().connect(sigc::mem_fun(*this, &FrameDelAdministrador::on_clicked_boton_ver));

}

void FrameDelAdministrador::cargarVector() {
	valores.push_back("1. Tablas y Gráficos");
	valores.push_back("2. Filtros o Inputs");
	valores.push_back("3. Resultado");
	mapa[valores[0]] = &frameTablaYGrafico;
	mapa[valores[1]] = &frameFiltrosInputs;
	mapa[valores[2]] = &frameResultadoConsultas;
}

void FrameDelAdministrador::on_selection_changed() {
	Glib::RefPtr<Gtk::TreeSelection> fila= frameSeleccion.getVisorModelo().get_selection();
	Gtk::TreeModel::iterator iter = fila->get_selected();

	if(iter) {
	  Gtk::TreeModel::Row fila = *iter;
	  std::string valor=fila[frameSeleccion.getColumna()];
	  Frame* frame = mapa[valor];

	  framePrueba.remove();
	  framePrueba.add(*frame);
	  framePrueba.show_all_children();
	}
}

FrameDelAdministrador::~FrameDelAdministrador() {
	framePrueba.remove();
}
